package tech.edwardvan.designpattern.pattern.structural.bridge;

import lombok.AllArgsConstructor;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;

/**
 * 桥接模式
 *
 * @author EdwardVan
 */
@Slf4j
public class BridgeDemo2 {

    public static void main(String[] args) {
        SMSSender smsSender = new SMSSender();
        EmailSender emailSender = new EmailSender();
        CommonEvent commonEvent = new CommonEvent(smsSender);
        commonEvent.handle("EdwardVan");
        commonEvent.setSender(emailSender);
        commonEvent.handle("EdwardVan");
    }

    /**
     * 事件等级接口
     */
    private interface EventLevel {
        /**
         * 处理事件
         *
         * @param director 负责人
         */
        void handle(String director);
    }

    /**
     * 发送渠道接口
     */
    private interface MessageSender {
        /**
         * 发送消息
         *
         * @param message 消息内容
         * @param toUser  消息接收人
         */
        void send(String message, String toUser);
    }

    /**
     * 事件等级抽象类
     */
    @AllArgsConstructor
    public abstract static class AbstractEventLevel implements EventLevel {
        /**
         * 持有一个实现部分的对象
         */
        @Setter
        MessageSender sender;
    }

    /**
     * 事件类型:普通
     */
    public static class CommonEvent extends AbstractEventLevel {

        public CommonEvent(MessageSender sender) {
            super(sender);
        }

        @Override
        public void handle(String director) {
            sender.send("普通事件测试消息", director);
        }
    }

    /**
     * 事件类型:紧急
     */
    public static class UrgencyEvent extends AbstractEventLevel {

        public UrgencyEvent(MessageSender sender) {
            super(sender);
        }

        @Override
        public void handle(String director) {
            sender.send("[紧急]紧急事件测试消息", director);
        }
    }

    /**
     * 发送渠道:短信
     */
    public static class SMSSender implements MessageSender {

        @Override
        public void send(String message, String toUser) {
            log.info("使用短信发送消息[{}]到[{}]", message, toUser);
        }
    }

    /**
     * 发送渠道:邮件
     */
    public static class EmailSender implements MessageSender {

        @Override
        public void send(String message, String toUser) {
            log.info("使用邮件发送消息[{}]到[{}]", message, toUser);
        }
    }

}
